微信开发 - access_token

在微信公众平台接口开发中,access_token占据了一个很重要的地位,它相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限。

同样微信服务器也是通过access_token识别是哪个公众号,以及该公众号是否有权限调用该接口。

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得,注意调用所有微信接口时均需使用https协议。

access_token开发策略

因为access_token具有每天2000次的访问限制,而access_token又是很重要的属性,调用非常频繁,基本上所有的接口都需要使用access_token来进行访问权限的验证,当频繁调用微信API时,很有可能会超出2000次的限制。因此普遍的解决方案是将一次获取的access_token保存到数据库,在两个小时后再更新数据库,在这两个小时内,所有需要access_token的地方全部到数据库来取。

access_token开发策略

接口调用请求说明

使用HTTP请求,请求方式为GET:

1
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

请求中附带的参数为:

参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

1
{"access_token":"ACCESS_TOKEN","expires_in":7200}
参数 说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

获取粉丝头像

下面我们用获取粉丝头像的例子来演示如何使用access_token。

首先写一个PHP文件,来获取access_token:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
getaccesstoken.php
<?php
define('appid', 'wx5d649f3295ce323a');
define('app_secret', 'a17ecddd3fb0699814fce90fa6376b8e');
function get_access_token() {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".appid."&secret=".app_secret;
//初始化
$ch = curl_init();
//设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 1);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//执行并获取HTML文档内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
//打印获得的数据
//print_r($output);
$access_taken_arr = json_decode($output, true);
$access_token = $access_taken_arr["access_token"];
//print_r($access_taken_arr);
return $access_token;
}

新建另一个PHP文件,首先获取粉丝列表,提取出粉丝的openid组成数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function get_user_list($access_token) {
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$access_token;
//echo $access_token;
//初始化
$ch = curl_init();
//设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 1);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//执行并获取HTML文档内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
//打印获得的数据
//print_r($output);
$user_list_arr = json_decode($output, true);
return ($user_list_arr["data"]["openid"]);
}

然后利用openid获取粉丝的用户信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function get_user_info($access_token, $openid) {
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 1);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$output = curl_exec($ch);
curl_close($ch);
$user_info_arr = json_decode($output, true);
return ($user_info_arr["headimgurl"]);
}

最后从用户信息中提取出用户头像的url,并传给iOS客户端:

1
2
3
4
5
6
7
8
for ($i=0; $i<3; $i++) {
$openid = $openids[$i];
$use_info = get_user_info($access_token, $openid);
$user_image = substr($use_info, 0, strlen($str)-2)."/132";
//echo $user_image;
array_push($user_images, $user_image);
}
echo json_encode($user_images);

在Xcode中创建工程,使用NSURLSession获取PHP服务器传来的包含粉丝头像url的数组,利用url获取粉丝头像,并将其设置为工程中ImageView的Image,这里需要注意的是,UI操作要转到主线程进行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
func getWechatFansHeadImgs() {
self.pleaseWait()
//let request = NSURLRequest(URL: NSURL(string: "http://localhost:8888/i/wechat/getuserinfo.php")!)
let request = NSURLRequest(URL: NSURL(string: "http://123.206.27.127/wechat/getuserinfo.php")!)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, resp, error) in
if error != nil {
print(error?.localizedDescription)
}
else {
var imgLinks: [String] = []
let readingOprions = NSJSONReadingOptions.MutableContainers
imgLinks = try! NSJSONSerialization.JSONObjectWithData(data!, options: readingOprions) as! Array//nil
print(imgLinks)
for i in 0..<imgLinks.count {
if imgLinks[i] != "" {
let data = NSData(contentsOfURL: NSURL(string: imgLinks[i])!)
dispatch_async(dispatch_get_main_queue(), {
self.headImageViews[i].image = data != nil ? UIImage(data: data!) : nil
print(i)
})
}
}
print(NSThread.currentThread())
dispatch_async(dispatch_get_main_queue(), {
self.clearAllNotice()
self.noticeSuccess("获取成功", autoClear: true, autoClearTime: 2)
})
}
}
task.resume()
}

最后使用点击事件触发这个方法:

1
2
3
4
5
@IBAction func showHeadImageButtonDidTouch(sender: AnyObject) {
getWechatFansHeadImgs()
}

Demo下载请点击这里